package com.chiemy.cardview.manager;

import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.Log;

import com.hs.ble.BluetoothLeService;

import java.nio.ByteBuffer;

public class CommandManager {
    
    private static final String TAG = CommandManager.class.getSimpleName();
    private static Context mContext;
    private static CommandManager instance;

    private CommandManager() {
    }

    public static synchronized CommandManager getInstance(Context context) {
        if (mContext == null) {
            mContext = context;
        }
        if (instance == null) {
            instance = new CommandManager();
        }
        return instance;
    }


    /**
     * 清除数据
     */
    public void setClearData(){
        Log.i(TAG, "setClearData: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x23;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) 0x00;
        broadcastData(bytes);
    }

    /**
     * 恢复手环出厂设置
     */
    public void setResetBand(){
        Log.i(TAG, "setResetBand: ");
        byte[] bytes = new byte[6];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 3;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0xFF;
        bytes[5] = (byte) 0x80;
        broadcastData(bytes);
    }


    /**
     * 单次、实时测量
     * @param status  心率：0X09(单次) 0X0A(实时)
     *                血氧：0X11(单次) 0X12(实时)
     *                血压：0X21(单次) 0X22(实时)
     *
     * @param control 0关  1开
     */
    public void setOnceOrRealTimeMeasure(int status, int control) {
        Log.i(TAG, "setOnceOrRealTimeMeasure: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x31;
        bytes[5] = (byte) status;
        bytes[6] = (byte) control;
        broadcastData(bytes);
    }

    /**
     * 一键测量
     * @param control  0(关)  1(开)
     */
    public void setOnceKeyMeasure(int control) {
        Log.i(TAG, "setOnceKeyMeasure: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x32;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte)control;
        broadcastData(bytes);
    }




    /**获取实时心率
     *
     * @param bol 0-关 1-开
     */
    public void getTrueTimeRate(int bol){
        Log.i(TAG, "getTrueTimeRate: ");
        byte[] data = new byte[7];
        data[0] = (byte) 0xAB;
        data[1] = (byte) 0;
        data[2] = (byte) 4;
        data[3] = (byte) 0xff;
        data[4] = (byte) 0x84;
        data[5] = (byte) 0x80;
        data[6] = (byte) bol;
//        data[6] = (byte)0;//占位符，没意义
        broadcastData(data);
    }



    /**
     * 查找手环
     */
    public void setFindBand() {
        Log.i(TAG, "setFindBand: ");
        byte[] bytes = new byte[6];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 3;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x71;
        bytes[5] = (byte) 0x80;
        broadcastData(bytes);
    }

 

    /**
     * 抬手亮屏
     * @param control  0关  1开
     */
    public void setUpHandLightScreen(int control) {
        Log.i(TAG, "setUpHandLightScreen: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x77;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) control;
        Log.i("lq","抬手亮屏"+"--"+control);
        broadcastData(bytes);
    }

    /**
     * 整点测量
     * @param control  0关  1开
     */
    public void setOnTimeMeasure(int control) {
        Log.i(TAG, "setOnTimeMeasure: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x78;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte)control;
        broadcastData(bytes);
    }

    /**
     * 心率报警
     * @param control  0关  1开
     */
    public void setHrWarn(int control) {
        Log.i(TAG, "setHrWarn: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x85;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte)control;
        broadcastData(bytes);
    }

    /**
     * 摇摇拍照指令
     * @param control 0关  1开
     */
    public void setSharkTakePhoto(int control){
        Log.i(TAG, "setSharkTakePhoto: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x79;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) control;
        broadcastData(bytes);
    }


    /**
     * 防丢
     * @param control  0关  1开
     */
    public void setAntiLostAlert(int control) {
        Log.i(TAG, "setAntiLostAlert: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x7A;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) control;
        broadcastData(bytes);
    }

    /**
     * 中英文切换
     * @param control  0中文  1英文
     */
    public void setSwitchChineseOrEnglish(int control) {
        Log.i(TAG, "setSwitchChineseOrEnglish: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x7B;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) control;
        broadcastData(bytes);
    }

    /**
     * 时间制切换
     * @param control  0（24小时制）  1(12小时制)
     */
    public void set12HourSystem(int control) {
        Log.i(TAG, "set12HourSystem: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x7C;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) control;
        broadcastData(bytes);
    }

    /**
     * 同步天气信息
     * @param weather  0多云 1晴天 2雪天 3雨天
     * @param temp  0(0度以上)  1(0度以下)
     */
    public void setSyncWeather(int weather, int temp) {
        Log.i(TAG, "setSyncWeather: ");
        byte[] bytes = new byte[9];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 6;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x7E;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) weather;
        bytes[7] = (byte) temp;
        bytes[8] = (byte) (temp >= 0 ? 0 : 1);
        broadcastData(bytes);
    }
    /**
     * 查看电量
     */
    public void getBattery(){
        byte[] bytes = new byte[6];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 3;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0xB2;
        bytes[5] = (byte) 0x80;
        broadcastData(bytes);
    }



    /**
     * 挂断电话
     */
    public void setHangUpPhone(){
        Log.i(TAG, "setHangUpPhone: ");
        byte[] bytes = new byte[6];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 3;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x81;
        bytes[5] = (byte) 0;
        broadcastData(bytes);
    }

    /**
     * 智能提醒
     * @param MessageId
     * @param type
     */
    public void setSmartWarnNoContent(int MessageId, int type) {
        Log.i(TAG, "setSmartWarnNoContent: ");
        byte[] bytes = new byte[8];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 5;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x72;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) MessageId;//来电提醒、短信提醒等
        bytes[7] = (byte) type;//0开 1关 2来消息通知
        broadcastData(bytes);
    }



    /**
     * 查看电量
     */
    public void getBatteryInfo(){
        Log.i(TAG, "getBatteryInfo: ");
        byte[] bytes = new byte[6];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 3;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x91;
        bytes[5] = (byte) 0x80;
        broadcastData(bytes);
    }

    /**
     * 查看版本
     */
    public void getVersionInfo(){
        Log.i(TAG, "getVersionInfo: ");
        byte[] bytes = new byte[6];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 3;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x92;
        bytes[5] = (byte) 0x80;
        broadcastData(bytes);
    }

    /**
     * 心电开始测量
     */
    public void startMeasureEcg(){
        Log.i(TAG, "startMeasureEcg: ");
        byte[] bytes = new byte[2];
        bytes[0] = (byte) 0xAC;
        bytes[1] = (byte) 0x01;
        broadcastData(bytes);
    }
    /**
     * 心电停止测量
     */
    public void stoptMeasureEcg(){
        Log.i(TAG, "stoptMeasureEcg: ");
        byte[] bytes = new byte[2];
        bytes[0] = (byte) 0xAC;
        bytes[1] = (byte) 0x00;
        broadcastData(bytes);
    }

  

    /**
     * 设置闹钟
     */
    public void setAlertClock(int id, int status, int hour, int minute, int repeat) {
        Log.i(TAG, "setAlertClock: ");
        byte[] data = new byte[11];
        data[0] = (byte) 0xAB;
        data[1] = (byte) 0;
        data[2] = (byte)8;
        //数据id + status 共 3 bytes
        data[3] = (byte) 0xff;
        data[4] = (byte) 0x73;
        data[5] = (byte)0x80;
        //数据值
        data[6] = (byte) id;
        data[7] = (byte) status;
        data[8] = (byte) hour;
        data[9] = (byte) minute;
        data[10] = (byte) repeat ;
        broadcastData(data);
    }






    /**
     * 校准时间
     */
    public void setCalibrationTime(int hour, int minute) {
        Log.i(TAG, "setCalibrationTime: ");
        byte[] bytes = new byte[8];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 5;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x7D;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) hour;//小时
        bytes[7] = (byte) minute;//分
        broadcastData(bytes);
    }


    /**
     * 进入bootloader
     */
    public void bootloaderMac() {
        Log.i(TAG, "bootloader: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x28;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) 1;
        broadcastData(bytes);
    }
 /**
     * 进入bootloader
     */
    public void bootloader() {
        Log.i(TAG, "bootloader: ");
        byte[] bytes = new byte[7];
        bytes[0] = (byte) 0xAB;
        bytes[1] = (byte) 0;
        bytes[2] = (byte) 4;
        bytes[3] = (byte) 0xFF;
        bytes[4] = (byte) 0x25;
        bytes[5] = (byte) 0x80;
        bytes[6] = (byte) 1;
        broadcastData(bytes);
    }
    public void otaMode(String password){
        Log.i(TAG,"otaMode");
        if (TextUtils.isEmpty(password)) {
            return;
        }
        byte[] passwordBytes = password.getBytes();
        byte[] bytes = new byte[13];
        bytes[0] = (byte) 0xDB;
        bytes[1] = (byte) 0x00;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) (passwordBytes.length+5);
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x00;
        bytes[6] = (byte) 0x00;
        bytes[7] = (byte) 0x00;

        bytes[8] = (byte) 0x04;
        bytes[9] = (byte) 0x00;
        bytes[10] = (byte) 0x01;
        bytes[11] = (byte) 0x00;
        bytes[12] = (byte) passwordBytes.length;

        byte[] bigByteArray = new byte[bytes.length + passwordBytes.length];

        ByteBuffer target = ByteBuffer.wrap(bigByteArray);
        target.put(bytes);
        target.put(passwordBytes);
        byte[] array = target.array();

        broadcastData(array);
    }
    public void otaMode2(){
        Log.i(TAG,"otaMode");

        byte[] bytes = new byte[13];
        bytes[0] = (byte) 0xDB;
        bytes[1] = (byte) 0x00;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x0d;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x00;
        bytes[6] = (byte) 0x00;
        bytes[7] = (byte) 0x00;

        bytes[8] = (byte) 0x04;
        bytes[9] = (byte) 0x00;
        bytes[10] = (byte) 0x01;
        bytes[11] = (byte) 0x00;
        bytes[12] = (byte) 0x08;

        byte[] bigByteArray = new byte[bytes.length + 8];

        ByteBuffer target = ByteBuffer.wrap(bigByteArray);
        target.put(bytes);
        byte[] array = target.array();


        broadcastData(array);
    }


    /**
     * 请求设备初始化状态
     */
    public void getInitStatus(){
        Log.i(TAG,"获取初始化状态");
        byte[] bytes = new byte[13];
        bytes[0] = (byte) 0xDB;
        bytes[1] = (byte) 0x00;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x05;
        bytes[4] = (byte) 0x01;
        bytes[5] = (byte) 0x01;
        bytes[6] = (byte) 0x00;
        bytes[7] = (byte) 0x00;

        bytes[8] = (byte) 0x01;
        bytes[9] = (byte) 0x00;
        bytes[10] = (byte) 0x01;
        bytes[11] = (byte) 0x00;
        bytes[12] = (byte) 0x00;
        broadcastData(bytes);
    }


    /**
     * 应答
     * @param data6
     * @param data7
     */
    public void anwser(int data6, int data7){
        Log.i(TAG,"应答");
        byte[] bytes = new byte[8];
        bytes[0] = (byte) 0xDB;
        bytes[1] = (byte) 0x10;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x00;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x00;
        bytes[6] = (byte) data6;
        bytes[7] = (byte) data7;
        broadcastData(bytes);
    }
    /**
     * @brief Broadcast intent with pointed bytes.
     * @param[in] bytes Array of byte to send on BLE.
     */
    private void broadcastData(byte[] bytes) {
        final Intent intent = new Intent(BluetoothLeService.ACTION_SEND_DATA_TO_BLE);
        intent.putExtra(BluetoothLeService.EXTRA_SEND_DATA_TO_BLE, bytes);
        try {
            LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
            Log.i(TAG,"发送广播 from CommandManager");
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }

}
